﻿using QuanLyThuVien.BLL;
using QuanLyThuVien.DTO;
using QuanLyThuVien.Supporter;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace QuanLyThuVien.GUI
{
    public partial class GUINhapDSDauSach : DevComponents.DotNetBar.Office2007Form
    {
        private BLLDauSach _bllDauSach;
        private BLLTheLoai _bllTheLoai;
        private BLLTacGia _bllTacGia;
        private BLLCT_TacGia _bllCT_TacGia;

        private List<DTOTacGia> _DSTacGia;
        private List<DTOTheLoai> _DSTheLoai;
        private List<DTODauSach> _DSDauSachThem;

        //----------------------------------------------------------------------
        //Desc: constructor mặc định
        //----------------------------------------------------------------------
        public GUINhapDSDauSach()
        {
            InitializeComponent();

            KhoiTao();
        }

        //----------------------------------------------------------------------
        //Desc: khởi tạo
        //----------------------------------------------------------------------
        public void KhoiTao()
        {
            _bllDauSach = new BLLDauSach();
            _bllTheLoai = new BLLTheLoai();
            _bllTacGia = new BLLTacGia();
            _bllCT_TacGia = new BLLCT_TacGia();
            _DSTacGia = _bllTacGia.LayDSTacGia();
            _DSTheLoai = _bllTheLoai.LayDSTheLoai();
            _DSDauSachThem = new List<DTODauSach>();

            if (_DSTacGia == null)
                MessageBox.Show("Không lấy được danh sách tác giả");
            if (_DSTheLoai == null)
                MessageBox.Show("Không lấy được danh sách thể loại");
        }

        //----------------------------------------------------------------------
        //Desc: lấy tên thể loại
        //----------------------------------------------------------------------
        private string LayTenTheLoai(string matl)
        {
            for (int i = 0; i < _DSTheLoai.Count; i++)
            {
                if (_DSTheLoai[i].MaTheLoai == matl)
                    return _DSTheLoai[i].TenTheLoai;
            }
            return null;
        }

        //----------------------------------------------------------------------
        //Desc: lấy tên tác giả
        //----------------------------------------------------------------------
        private string LayTenTacGia(string matg)
        {
            for (int i = 0; i < _DSTacGia.Count; i++)
            {
                if (_DSTacGia[i].MaTG == matg)
                    return _DSTacGia[i].TenTG;
            }
            return null;
        }

        //----------------------------------------------------------------------
        //Desc: kiểm tra tên các cột trong file excel có đúng định dạng không
        //----------------------------------------------------------------------
        private bool KiemTraDataTable(DataTable data)
        {
            try
            {
                bool exitst = false;
                for (int i = 0; i < data.Columns.Count; i++)
                {
                    if (data.Columns[i].ColumnName == "TenDauSach")
                        exitst = true;
                }
                if (!exitst)
                    return false;

                exitst = false;
                for (int i = 0; i < data.Columns.Count; i++)
                {
                    if (data.Columns[i].ColumnName == "MaTL")
                        exitst = true;
                }
                if (!exitst)
                    return false;

                exitst = false;
                for (int i = 0; i < data.Columns.Count; i++)
                {
                    if (data.Columns[i].ColumnName == "MaTG1")
                        exitst = true;
                }
                if (!exitst)
                    return false;

                exitst = false;
                for (int i = 0; i < data.Columns.Count; i++)
                {
                    if (data.Columns[i].ColumnName == "MaTG2")
                        exitst = true;
                }
                if (!exitst)
                    return false;

                exitst = false;
                for (int i = 0; i < data.Columns.Count; i++)
                {
                    if (data.Columns[i].ColumnName == "MaTG3")
                        exitst = true;
                }
                if (!exitst)
                    return false;

                return true;
            }
            catch { return false; }
        }

        //----------------------------------------------------------------------
        //Desc: đọc đầu sách dùng cho phần load danh sách đầu sách
        //----------------------------------------------------------------------
        public DTODauSach LayDuLieuTuFileExcel(DataRow row)
        {
            try
            {
                DTODauSach dausach = new DTODauSach();
                dausach.TenDauSach = row["TenDauSach"].ToString();
                dausach.TheLoai.MaTheLoai = row["MaTL"].ToString();
                if (dausach.TheLoai.MaTheLoai == "")
                    return null;
                else
                {
                    dausach.TheLoai.TenTheLoai = LayTenTheLoai(dausach.TheLoai.MaTheLoai);
                    if (dausach.TheLoai.TenTheLoai == null)
                        return null;
                }

                string matg1 = row["MaTG1"].ToString();
                string matg2 = row["MaTG2"].ToString();
                string matg3 = row["MaTG3"].ToString();
                if (matg1 != "")
                {
                    string tentg = LayTenTacGia(matg1);
                    if (tentg != null)
                        dausach.DSCT_TacGia.Add(new DTOCT_TacGia(new DTOTacGia(matg1, tentg)));
                }
                if (matg2 != "")
                {
                    string tentg = LayTenTacGia(matg2);
                    if (tentg != null)
                        dausach.DSCT_TacGia.Add(new DTOCT_TacGia(new DTOTacGia(matg2, tentg)));
                }
                if (matg3 != "")
                {
                    string tentg = LayTenTacGia(matg3);
                    if (tentg != null)
                        dausach.DSCT_TacGia.Add(new DTOCT_TacGia(new DTOTacGia(matg3, tentg)));
                }
                if (dausach.DSCT_TacGia.Count == 0)
                    return null;

                return dausach;
            }
            catch { return null; }
        }

        //----------------------------------------------------------------------
        //Desc: thêm 1 dòng dữ liều vào datagridview
        //----------------------------------------------------------------------
        public void HienThiLenDataGridView(string tendausach, string tentheloai, string tentacgia)
        {
            if (_dgwDSDauSach != null)
                _dgwDSDauSach.Rows.Add(tendausach, tentheloai, tentacgia);
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện click button LoadDanhSach
        //----------------------------------------------------------------------
        private void btnLoadDS_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Filter = "Excel files (*.xlsx, *.xls)|*.xlsx;*.xls";
            dlg.ShowDialog();
            string fileName = dlg.FileName;
            if (fileName != "")
            {
                DataTable data = Utils.ReadExcelFile(fileName);
                if (data == null)
                    MessageBox.Show("Đọc file thất bại");
                else if (!KiemTraDataTable(data))
                    MessageBox.Show("File không đúng định dạng");
                else
                {
                    foreach (DataRow row in data.Rows)
                    {
                        DTODauSach dausach = LayDuLieuTuFileExcel(row);
                        if (dausach != null)
                        {
                            _DSDauSachThem.Add(dausach);
                            string dstentg = "";
                            if (dausach.DSCT_TacGia.Count > 0)
                                dstentg = dausach.DSCT_TacGia[0].TacGia.TenTG;
                            if (dausach.DSCT_TacGia.Count > 1)
                            {
                                for (int i = 1; i < dausach.DSCT_TacGia.Count; i++)
                                    dstentg += ", " + dausach.DSCT_TacGia[i].TacGia.TenTG;
                            }

                            HienThiLenDataGridView(dausach.TenDauSach, dausach.TheLoai.TenTheLoai, dstentg);
                        }
                    }
                }
            }
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện click button Thoat
        //----------------------------------------------------------------------
        private void btnThoat_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện click button Nhap
        //----------------------------------------------------------------------
        private void btnNhap_Click(object sender, EventArgs e)
        {
            if (_DSDauSachThem.Count == 0)
                MessageBox.Show("Chưa nhập đầu sách nào");
            else
            {
                int dem = 0;
                for (int i = 0; i < _DSDauSachThem.Count; i++)
                {
                    DTODauSach dausach = _DSDauSachThem[i];
                    if (_bllDauSach.PhatSinhMaDauSach(ref dausach))
                    {
                        if (_bllDauSach.CapNhat(dausach))
                        {
                            for (int j = 0; j < dausach.DSCT_TacGia.Count; j++)
                            {
                                if (_bllCT_TacGia.CapNhat(dausach.DSCT_TacGia[j]))
                                { }
                            }

                            _DSDauSachThem[i].Reset();
                            _DSDauSachThem[i] = dausach;
                            dem++;
                        }
                    }
                }
                MessageBox.Show("Nhập thành công " + dem.ToString() + " đầu sách");
            }
        }

        //----------------------------------------------------------------------
        //Desc: xử lý sự kiện click button ThemMoi
        //----------------------------------------------------------------------
        private void btnThemMoi_Click(object sender, EventArgs e)
        {

        }
        //----------------------------------------------------------------------
        //Desc: chặn sự kiện xóa dòng
        //----------------------------------------------------------------------
        private void dgwDSDauSach_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
        {
            e.Cancel = true;
        }
    }
}
